package cn.learn.service.cargo.impl;

import cn.learn.dao.cargo.*;
import cn.learn.domain.cargo.*;
import cn.learn.service.cargo.ExportService;
import cn.learn.vo.ExportProductResult;
import cn.learn.vo.ExportResult;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

@Service
public class ExportServiceImpl implements ExportService {

    @Autowired
    private ContractDao contractDao;
    @Autowired
    private ContractProductDao contractProductDao;
    @Autowired
    private ExtCproductDao extCproductDao;
    @Autowired
    private ExportDao exportDao;
    @Autowired
    private ExportProductDao exportProductDao;
    @Autowired
    private ExtEproductDao extEproductDao;

    @Override
    public Export findById(String id) {
        Export export = exportDao.selectByPrimaryKey(id);
        return export;
    }

    @Override
    public void save(Export export) {
        //1 修改合同的状态
        //1.1 获取合同的id
        String contractIds = export.getContractIds();
        //1.2 切割每一个合同id
        String[] contractIdsArr = contractIds.split(",");
        // 1.3 循环遍历合同id获取每一个合同
        StringBuffer buffer = new StringBuffer();
        for (String contractId : contractIdsArr) {
            //1.4 获取合同 修改合同状态

            Contract contract = contractDao.selectByPrimaryKey(contractId);
            contract.setState(2);// 已报运
            //1.5 记录每一个合同的合同号（合同号之间空格隔开）
            buffer.append(contract.getContractNo()).append(" "); //ht001 ht002
            //1.6 修改合同
            contractDao.updateByPrimaryKeySelective(contract);
        }
        //2 保存报运单数据(手动设置id 合同号 状态 创建时间)
        export.setId(UUID.randomUUID().toString().replace("-","")); //主键
        export.setCustomerContract(buffer.toString()); //合同号
        export.setState(0); //状态 0：草稿
        export.setCreateTime(new Date()); //生成报运单的时间
        //3 保存货物数据（来源于合同的货物数据）
        //3.1 根据合同的id货物数据
        ContractProductExample productExample = new ContractProductExample();
        ContractProductExample.Criteria productExampleCriteria = productExample.createCriteria();
        //3.2 将数组转换成集合 根据条件id的集合查询合同的货物
        List<String> ContractIdsList = Arrays.asList(contractIdsArr);
        productExampleCriteria.andContractIdIn(ContractIdsList);
        List<ContractProduct> productList = contractProductDao.selectByExample(productExample);
        //3.3 遍历循环合同货物
        //合同的货物==报运单的货物
        // 记录合同的货物id==报运单的货物id  map<合同货物的id,报运单的货物id>
        Map<String, String> map = new HashMap<>();
        for (ContractProduct contractProduct : productList) {
            //3.4 循环一个合同货物创建一个报运单货物
            ExportProduct exportProduct = new ExportProduct();
            //3.5 将合同的每一个货物数据给报运单的每一个货物
            BeanUtils.copyProperties(contractProduct,exportProduct);
            //3.6 设置报运单的唯一主键
            exportProduct.setId(UUID.randomUUID().toString().replace("-",""));
            //3.7 设置货物属于那个报运单
            exportProduct.setExportId(export.getId());
            //3.8 保存每一个报运单的货物
            exportProductDao.insertSelective(exportProduct);
            //3.9 记录合同的货物id和报运单的货物id
            map.put(contractProduct.getId(),exportProduct.getId());  // key:合同的货物id  value:报运单的货物id

        }
        //4 保存附件数据(来源于合同的货物附件)
        //4.1 根据合同的id获取合同的附件
        ExtCproductExample extCproductExample = new ExtCproductExample();
        ExtCproductExample.Criteria extCproductExampleCriteria = extCproductExample.createCriteria();
        extCproductExampleCriteria.andContractIdIn(ContractIdsList);
        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);
        //4.2 遍历循环合同下的附件(附件有货物id)   map.get(extCproduct.getContractProductId(合同的货物id))
        for (ExtCproduct extCproduct : extCproductList) {
            //4.3 有一个合同的附件就有一个报运单的附件
            ExtEproduct extEproduct = new ExtEproduct();
            //4.4 将合同的附件数据给报运单的附件数据
            BeanUtils.copyProperties(extCproduct,extEproduct);
            //4.5 设置报运单的附件主键
            extEproduct.setId(UUID.randomUUID().toString().replace("-",""));
            //4.6 设置报运单的附件属于那个货物id
            extEproduct.setExportProductId(map.get(extCproduct.getContractProductId()));
            //4.7 设置报运单的附件属于那个报运单id
            extEproduct.setExportId(export.getId());
            //4.8 保存附件
            extEproductDao.insertSelective(extEproduct);
        }
        //5 设置报运单的货物数/附件数
        export.setProNum(productList.size());
        export.setExtNum(extCproductList.size());
        //6 保存报运单
        exportDao.insertSelective(export);
    }

    @Override
    public void update(Export export) {
        //1 修改报运单的数据
        exportDao.updateByPrimaryKeySelective(export);
        // 2 修改报运单下货物的数据
        List<ExportProduct> list = export.getExportProducts();
        for (ExportProduct exportProduct : list) {
            exportProductDao.updateByPrimaryKeySelective(exportProduct);
        }
    }

    @Override
    public void delete(String id) {
        // 删除报运单
        exportDao.deleteByPrimaryKey(id);
        // 删除报运单的货物
        // 根据报运单的id获取货物集合
        ExportProductExample exportProductExample = new ExportProductExample();
        ExportProductExample.Criteria criteria = exportProductExample.createCriteria();
        criteria.andExportIdEqualTo(id);
        List<ExportProduct> porductlist = exportProductDao.selectByExample(exportProductExample);
        // 遍历循环删除每一个货物
        for (ExportProduct exportProduct : porductlist) {
            exportProductDao.deleteByPrimaryKey(exportProduct.getId());
        }
        // 删除报运单的货物附件
        // 根据报运单的id获取货物集合
        ExtEproductExample extEproductExample = new ExtEproductExample();
        ExtEproductExample.Criteria criteria1 = extEproductExample.createCriteria();
        criteria1.andExportIdEqualTo(id);
        List<ExtEproduct> extEproductsList = extEproductDao.selectByExample(extEproductExample);
        // 遍历循环删除每一个货物
        for (ExtEproduct extEproduct : extEproductsList) {
            extEproductDao.deleteByPrimaryKey(extEproduct.getId());
        }
    }

    @Override
    public PageInfo findAll(ExportExample example, int page, int size) {
        PageHelper.startPage(page, size);
        List<Export> list = exportDao.selectByExample(example);
        PageInfo pageInfo = new PageInfo(list);
        return pageInfo;
    }

    @Override
    public void updateByResult(ExportResult exportResult) {
        // 根据报运单id货物报运单
        Export export = exportDao.selectByPrimaryKey(exportResult.getExportId());
        // 设置报运单属性
        export.setState(exportResult.getState());
        export.setRemark(exportResult.getRemark());
        // 修改报运单
        exportDao.updateByPrimaryKeySelective(export);
        // 修改报运单下的货物
        if (exportResult.getProducts() != null) {
            for (ExportProductResult productResult : exportResult.getProducts()) {
                // 获取到货物
                ExportProduct exportProduct = exportProductDao.selectByPrimaryKey(productResult.getExportProductId());
                // 修改货物的税值
                exportProduct.setTax(productResult.getTax());
                // 修改每一个货物
                exportProductDao.updateByPrimaryKeySelective(exportProduct);
            }
        }
    }

    @Override
    public void submit(Export export) {
        exportDao.updateByPrimaryKeySelective(export);
    }

}
